/**
 * 优先优先队列是在正常优先队列的基础上加了优先级，保证每次的队首元素都是优先级最大的。
 * 可以实现每次从优先优先队列中取出的元素都是优先队列中优先级最大的一个。
 * 它的底层是通过堆来实现的
 *
 * 优先队列只能通过top()访问队首元素（优先级最高的元素）
 * 不提供该方法，注意没有clear()
 */
#include <iostream>
#include <queue>

using namespace std;

priority_queue<int> init_priority_queue();

void print_priority_queue(priority_queue<int> int_priority_queue);

int main()
{
    // 初始化定义
    priority_queue<int> pri_queue = init_priority_queue();
    print_priority_queue(pri_queue);
    // 访问队首元素
    cout << pri_queue.top() << endl;
    // 入队
    pri_queue.push(5);
    pri_queue.push(6);
    print_priority_queue(pri_queue);
    // 堆顶（队首）元素出队
    pri_queue.pop();
    print_priority_queue(pri_queue);
    // 优先队列元素个数
    cout << pri_queue.size() << endl;
    // 是否为空
    if (pri_queue.empty())
    {
        cout << "优先队列为空" << endl;
    } else
    {
        cout << "优先队列不为空" << endl;
    }
    // TODO 基本数据类型的优先级
    return 0;
}

/**
 * 初始化优先优先队列
 * @return
 */
priority_queue<int> init_priority_queue()
{
    priority_queue<int> int_priority_queue;
    for (int i = 0; i < 5; i++)
    {
        int_priority_queue.push(i);
    }
    return int_priority_queue;
}

/**
 * 打印优先优先队列
 * @param int_priority_queue
 */
void print_priority_queue(priority_queue<int> int_priority_queue)
{
    while (!int_priority_queue.empty())
    {
        cout << int_priority_queue.top() << " ";
        int_priority_queue.pop();
    }
    cout << endl;
}